/**
 * 微信小程序选择器转换插件
 * 自动将不兼容的CSS选择器转换为小程序支持的格式
 */
import type { Plugin } from 'vite'
import process from 'node:process'

/**
 * 微信小程序支持的基础组件选择器
 */
const MP_COMPONENTS = [
  'view', 'text', 'button', 'input', 'textarea', 'image',
  'scroll-view', 'swiper', 'swiper-item', 'cover-view',
  'cover-image', 'icon', 'rich-text', 'progress', 'checkbox',
  'form', 'label', 'picker', 'radio', 'slider', 'switch',
  'navigator', 'audio', 'video', 'map', 'canvas', 'web-view'
]

/**
 * 转换通配符选择器为具体组件选择器
 * @param selector 原始选择器
 * @returns 转换后的选择器
 */
function transformUniversalSelector(selector: string): string {
  // 匹配 :deep(*) 或类似的通配符选择器
  const deepUniversalRegex = /:deep\(\*\)/g
  const universalRegex = /\B\*\B/g
  
  let transformed = selector
  
  // 转换 :deep(*) 为具体组件选择器
  if (deepUniversalRegex.test(transformed)) {
    const componentSelectors = MP_COMPONENTS.map(comp => `:deep(${comp})`).join(',\n')
    transformed = transformed.replace(deepUniversalRegex, componentSelectors)
  }
  
  // 转换普通的通配符选择器
  if (universalRegex.test(transformed)) {
    const componentSelectors = MP_COMPONENTS.join(',\n')
    transformed = transformed.replace(universalRegex, componentSelectors)
  }
  
  return transformed
}

/**
 * 处理CSS内容，转换不兼容的选择器
 * @param css CSS内容
 * @returns 转换后的CSS内容
 */
function transformCSS(css: string): string {
  // 匹配CSS规则块
  const ruleRegex = /([^{}]+)\{([^{}]*)\}/g
  
  return css.replace(ruleRegex, (match, selector, declarations) => {
    const transformedSelector = transformUniversalSelector(selector.trim())
    return `${transformedSelector} {${declarations}}`
  })
}

/**
 * 创建微信小程序选择器转换插件
 * @returns Vite插件配置
 */
export function createMpSelectorTransformPlugin(): Plugin {
  return {
    name: 'mp-selector-transform',
    apply: 'build', // 只在构建时应用
    generateBundle(options, bundle) {
      // 只处理微信小程序平台
      if (process.env.UNI_PLATFORM !== 'mp-weixin') {
        return
      }
      
      // 遍历所有输出文件
      Object.keys(bundle).forEach(fileName => {
        const file = bundle[fileName]
        
        // 只处理CSS文件
        if (file.type === 'asset' && fileName.endsWith('.wxss')) {
          const originalCSS = file.source as string
          const transformedCSS = transformCSS(originalCSS)
          
          // 如果有变化，更新文件内容
          if (originalCSS !== transformedCSS) {
            file.source = transformedCSS
            console.log(`[mp-selector-transform] 已转换文件: ${fileName}`)
          }
        }
      })
    }
  }
}

export default createMpSelectorTransformPlugin